import threading
import queue
import time
import random

def producer(q, count):
    """生产者：生成指定数量数据后发送结束信号"""
    for i in range(count):
        data = random.randint(1, 100)
        q.put(data)
        print(f"生产: {data}")
        time.sleep(random.uniform(0.1, 0.3))  # 模拟生产耗时
    q.put(None)  # 发送结束信号
    print("生产者完成")

def consumer(q):
    """消费者：处理数据直到收到结束信号"""
    while True:
        data = q.get()  # 从队列取数据
        if data is None:  # 检查结束信号
            print("消费者退出")
            q.task_done()
            break
        print(f"消费: {data} → 处理后: {data*2}")
        q.task_done()  # 标记任务完成
        time.sleep(random.uniform(0.2, 0.4))  # 模拟处理耗时

if __name__ == "__main__":
    # 创建队列和线程
    q = queue.Queue()
    p = threading.Thread(target=producer, args=(q, 3))  # 生产5个数据
    c = threading.Thread(target=consumer, args=(q,))
    
    # 启动线程
    p.start()
    c.start()
    
    # 等待线程完成
    p.join()
    q.join()  # 等待队列处理完毕
    c.join()
    
    print("所有工作完成")
    
"""
事件对象说明（注释）
构造方法：
event = threading.Event()
常用方法：
set(): 设置内部标志为 True，并唤醒所有等待的线程。
clear(): 将内部标志重置为 False。
wait(timeout=None): 阻塞线程直到内部标志为 True 或超时。
is_set(): 判断内部标志是否为 True。
"""
